複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点
タイトル
複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点
困っていること
以下の記事を参考に、特定のアカウントにVPCエンドポイントを集約する構成を採用しています。
Amazon Elastic Container Registry(以降、ECR)のプライベートレジストリに保存されたコンテナイメージを使用し、プライベートサブネットでAWS Fargateタスクを起動する場合、ECR用のVPCエンドポイント(com.amazonaws.region.ecr.dkr)が必要です。
上記の記事を参考にcom.amazonaws.region.ecr.dkr
も集約し、ECSサービスでタスク1つ起動しようとすると以下のエラーでタスクが停止してしまいます。
CannotPullContainerError: pull image manifest has been retried 5 time(s): failed to resolve ref 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/repo:latest: failed to do request: Head "https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/v2/repo/manifests/latest": dial tcp: lookup 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com on xx.xx.xx.xx:xx: no such host
解決方法を教えてください。
原因
このエラーは、ECSタスク起動時にECRからコンテナイメージを取得する際、以下のDNS名に対する名前解決ができなかったことを示しています。
- 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
ECRは、AWSが提供するフルマネージドのコンテナイメージレジストリサービスです。
各AWSアカウントには、デフォルトでプライベートECRレジストリが提供されています。
URLは以下の通りです。
https://aws_account_id.dkr.ecr.region.amazonaws.com
The URL for your default private registry is
https://aws_account_id.dkr.ecr.region.amazonaws.com
https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html
そのため、DockerイメージのPush/Pull操作等で利用される、ECRのDockerレジストリに対するVPCエンドポイントcom.amazonaws.region.ecr.dkr
では、アカウントIDの指定が必要です。
ちなみに、ECR用のVPCエンドポイント(com.amazonaws.region.ecr.api)については、アカウントIDの指定は不要です。このエンドポイントは、参考記事の手順通りに設定することで、共有先アカウントで利用可能になります。
前提条件
本設定を実施する前に、参考記事の手順に従い、以下の前提条件が満たされていることを確認してください。
- VPCエンドポイント集約アカウントと共有先アカウントとの間で、Route53プライベートホストゾーンの「関連付けの承認」と「関連付け」までが完了していること
また、VPCエンドポイント集約アカウントのRoute 53プライベートホストゾーンで、以下が設定済みか確認ください。
- ホストゾーン名
dkr.ecr.ap-northeast-1.amazonaws.com
が作成されていること - 関連付けられたVPCに、VPCエンドポイント共有先アカウントのVPCが指定されていること(下図赤枠部分)
対処方法
まず、Route 53プライベートホストゾーンから、アカウントIDが指定されていないレコード名dkr.ecr.ap-northeast-1.amazonaws.com
(タイプA)を削除します。このレコードは不要です。
新たに123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
という名前のレコードを作成します。アカウントIDは共有先アカウントIDです。
トラフィックルーティング先は、作成済みのVPCエンドポイントであるcom.amazonaws.region.ecr.dkr
を指定します。
以上で設定は完了です。
これにより、VPCエンドポイント共有先アカウントでECRからコンテナイメージを取得し、ECSタスクを正常に起動できるようになります。
VPCエンドポイント共有先アカウント追加手順
新たなアカウントでVPCエンドポイントの共有設定が必要な場合は、以下の手順に従って設定を行ってください。
- 参考記事の手順通り、新しいVPCエンドポイント共有先アカウントとの関連付けまでを実施
- レコード名
アカウントID.dkr.ecr.ap-northeast-1.amazonaws.com
を作成
※アカウントIDは実際の12桁の数値に置き換えてください
これにより、新しいアカウントでもVPCエンドポイントが利用可能になります。
参考